

procedure SerCRLF;
begin
  Serout(#$0D);
  Serout(#$0A);
end;

procedure serprompt(ok:boolean);
begin
  if ok then
   Serout(#$3D);  //"="
  else
    Serout(#$3F);   //"?"
  endif;
  Serout(#$3E);   //">"
  SerCRLF;
  aBool:=ok;
end;


procedure BurstGen;
//Burst-Generierung per Software, whrend auf Tastatureingabe gewartet wird
begin
  if BurstMode <> 0 then
    if isSysTimerZero(BurstTimer) then
      setSystimer(BurstTimer, 10);
      dec(BurstCount);
      if BurstCount = 0 then
        dss_cmd:= c_ddsresetcmd;
        SendDDS;
        BurstCount:= BurstMode + 1;
        BurstPrime:= true;
      endif;
    endif;
    if BurstCount = 1 then
      if BurstPrime then
        dss_cmd:= wave_cmd;
        SendDDS;
        BurstPrime:= false;
      endif;
    endif;
  endif;
end;

procedure SerOutFreq(myfreq: Longint);
var
  lastdigit:char;
  l:byte;
begin
  FreqStr:= longtostr(myfreq); // ohne fhrenden Nullen
  l:=length(FreqStr);
  lastdigit:=FreqStr[l];  //letztes Zeichen
  dec(l);
  SetLength(freqStr,l);
  write(serout, freqStr);
  serout('.');
  serout(lastdigit);
end;

procedure SetSweepUpper;
// obere Frequenz-Grenze fr Sweep setzen
begin
  SweepUpper:=longint(gettable(SweepFak,SweepRange));
  SweepUpper:=SweepUpper*Frequenz;
  SweepStarted:=false;
end;

procedure SweepGen;
//Sweep-Generierung per Software, Ausgabe aktueller Frequenz seriell
begin
  if (SweepRange <> 0) then
//    dec(SweepCount);
    if not SweepStarted then
      setSystimer(BurstTimer, SweepTime);
      SetLevelDDS;
//      SweepCount:=0;
      SweepStarted:=true;
    endif;
    if isSysTimerZero(BurstTimer) then
      setSystimer(BurstTimer, SweepTime);
      AktuelleFrequenz:=(AktuelleFrequenz * 101) div 100;
      SetLevelDDS;
      mdelay(word(SweepTime));
      if AktuelleFrequenz>=SweepUpper then
        SweepStarted:=false;
        AktuelleFrequenz:=Frequenz;
        if SweepOnce then
          SweepRange:=0;
          write(serout, StopStr);
          SerCRLF;
          serprompt(true);
          SweepOnce:=false;
          AktuelleFrequenz:=Frequenz;
          SetLevelDDS; // Falls durch Burst abgeschaltet
        endif;
      endif;
    endif;
{
    if SweepCount <= 0 then
      SweepCount:=3; // Alle 4 neuen Frequenzen eine Ausgabe
      write(serout, SCPIFreqStr);
      SerOutFreq(AktuelleFrequenz);
      serout(#10);
    endif;
}

  else
    AktuelleFrequenz:=Frequenz;
    if SweepOnce then
      serprompt(true);
      SweepOnce:=false;
      SetLevelDDS; // Falls durch Burst abgeschaltet
    endif;
  endif;
end;

procedure ParseCmd;
var
  InpStr:string[63];
  ParamStr:string[15];
  Param:LongInt;
  ParamByte:byte;
  ParamDez:byte;
  Request:boolean;
  CmdChar1, CmdChar2:char;

begin
  readln(SerInp, InpStr);
  InpStr:=uppercase(InpStr);
  if length(InpStr) = 0 then
    serprompt(true);
    return;
  endif;
//Parse einzelnen Befehl
  i:=pos(' ',InpStr); // Trenner
  Request:=(pos('?',InpStr)>1); // Request
  CmdChar1:=InpStr[1];
  CmdChar2:=InpStr[2];
  ParamStr:=copy(InpStr,i+1,15);
  i:=pos('.',ParamStr);
  ParamDez:=0;
  if i > 1 then
    ParamStr:=copy(ParamStr,1,i-1);
    ParamDez:=byte(ParamStr[i+1])-48;  // 1. Nachkommastelle
  endif;
  Param:=StrtoInt(ParamStr);
  ParamByte:=byte(Param);
  aBool:=true;

  if request then
    case  CmdChar1 of
      '*':
        if (Cmdchar2='I') then
          write(Serout,Vers1Str);
          SerCRLF;
        else
          serprompt(false);
        endif;
        |
      'F':
        SeroutFreq(AktuelleFrequenz);
        SerCRLF;
        |
      'W':
        write(serout, bytetostr(wave));
        SerCRLF;
        |
      'V', 'M':
        write(Serout,inttostr(GetAdc));
        SerCRLF;
        |
    else
      serprompt(false);
    endcase;
  else  // kein Request, also Parameter setzen
    case  CmdChar1 of
      'F':
        AktuelleFrequenz:= Param * 10 + longInt(ParamDez);
        Frequenz:=AktuelleFrequenz;
        SetSweepUpper;
        |
      'W':
        wave:= ParamByte;
        |
      'L':
//        AttnStep:= ParamByte;
        |
      'B':
        BurstMode:= ParamByte;
        |
      'S': // SweepRange
        SweepRange:= ParamByte;
        SweepOnce:=true;
        SetSweepUpper;
        SerOutFreq(Frequenz);
        serout(#44); //","
        serout(#32);
        SerOutFreq(SweepUpper);
        SerCRLF;
        |
      'T': // SweepTime
        SweepTime:= ParamByte;
        |
    else
      serprompt(false);
    endcase;
  endif;

  if aBool then
    serprompt(true);
  endif;
  SetLevelDDS;
end;

{###########################################################################}

